package com.etl.extract;

import com.eksframework.commons.core.base.EksDate;
import com.google.common.collect.Maps;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 查询参数
 *
 * @author: chenfenghai
 * @version: 1.0
 * @date: 2020-10-15 15:53
 */
public class QueryParameter {

    /**
     * 查询参数MAP键值对
     */
    private Map<String, Object> parameterMap = Maps.newHashMap();

    /**
     * 私有构造函数
     */
    private QueryParameter() {
    }

    /**
     * 静态创建对象方法
     *
     * @param scheduleTask 调度任务
     * @return QueryParameter
     */
    public static QueryParameter of(ScheduleTask scheduleTask) {
        QueryParameter param = new QueryParameter();
        if (Objects.isNull(scheduleTask)) {
            return param;
        }
        // 组装通用查询SQL参数
        param.put("tenantId", scheduleTask.getTenant().getTenantId());
        param.put("cinemaUid", scheduleTask.getCinema().getCinemaUid());
        param.put("cinemaCode", scheduleTask.getCinema().getCinemaCode());
        param.put("cinemaName", scheduleTask.getCinema().getCinemaName());
        param.put("moduleCode", scheduleTask.getModule().getModuleCode());
        param.put("lastSign", scheduleTask.getSchedule().getLastSign());
        param.put("startTime", scheduleTask.getSchedule().getExecTimeStart());
        param.put("endTime", scheduleTask.getSchedule().getExecTimeEnd());
        param.put("limit", scheduleTask.getSchedule().getLimitNum());
        return param;
    }

    /**
     * 添加字符串参数
     *
     * @param key   参数KEY
     * @param value 参数VALUE
     * @return QueryParameter
     */
    public QueryParameter put(final String key, final String value) {
        if (Objects.isNull(key) || Objects.isNull(value)) {
            return this;
        }
        parameterMap.put(StringUtils.trim(key), StringUtils.trim(value));
        return this;
    }

    /**
     * 添加整数参数
     *
     * @param key   参数KEY
     * @param value 参数VALUE
     * @return QueryParameter
     */
    public QueryParameter put(final String key, final int value) {
        return put(key, String.valueOf(value));
    }

    /**
     * 添加整数参数
     *
     * @param key   参数KEY
     * @param value 参数VALUE
     * @return QueryParameter
     */
    public QueryParameter put(final String key, final Integer value) {
        if (Objects.isNull(key) || Objects.isNull(value)) {
            return this;
        }
        return put(key, value.intValue());
    }

    /**
     * 添加长整数参数
     *
     * @param key   参数KEY
     * @param value 参数VALUE
     * @return QueryParameter
     */
    public QueryParameter put(final String key, final long value) {
        return put(key, String.valueOf(value));
    }

    /**
     * 添加长整数参数
     *
     * @param key   参数KEY
     * @param value 参数VALUE
     * @return QueryParameter
     */
    public QueryParameter put(final String key, final Long value) {
        if (Objects.isNull(key) || Objects.isNull(value)) {
            return this;
        }
        return put(key, value.longValue());
    }

    /**
     * 添加字符串列表参数
     *
     * @param key   参数KEY
     * @param value 参数VALUE
     * @return QueryParameter
     */
    public QueryParameter put(final String key, final List<String> value) {
        if (Objects.isNull(key) || CollectionUtils.isEmpty(value)) {
            return this;
        }
        parameterMap.put(StringUtils.trim(key), value);
        return this;
    }

    /**
     * 添加日期时间参数
     *
     * @param key   参数KEY
     * @param value 参数VALUE
     * @return QueryParameter
     */
    public QueryParameter put(final String key, final LocalDateTime value) {
        if (Objects.isNull(key) || Objects.isNull(value)) {
            return this;
        }
        return put(key, EksDate.of(value).toDateTimeString());
    }

    /**
     * 获取设置的参数MAP键值对
     *
     * @return Map
     */
    public Map<String, Object> getParameterMap() {
        return parameterMap;
    }
}
